/*
 * @Author       : heyongfeng
 * @Date         : 2021-06-30 17:57:40
 * @Description  : 获取git信息
 * @LastEditors  : heyongfeng
 * @LastEditTime : 2021-06-30 18:08:58
 */

import { execSync } from 'child_process'
import os from 'os'
import chalk from 'chalk'

function formatDate(value: string | number) {
  let fmt = 'yyyy-MM-dd hh:mm:ss'
  let date = new Date(value)
  let o: { [name: string]: any } = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    S: date.getMilliseconds() // 毫秒
  }
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      (date.getFullYear() + '').substr(4 - RegExp.$1.length)
    )
  }
  for (let k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
      )
    }
  }
  return fmt
}
function getGitInfo() {
  try {
    execSync('git --version')
  } catch (error) {
    console.log(chalk.yellow('git not found'))
    return {}
  }
  try {
    const branch = execSync('git branch')
      .toString()
      .split('\n')
      .filter((v) => v.startsWith('*'))[0]
      .slice(2)
    const commit = execSync('git show -s --format=%H').toString().trim() // 当前提交的版本号
    let name = execSync('git show -s --format=%cn').toString().trim() // 姓名
    let email = execSync('git show -s --format=%ce').toString().trim() // 邮箱
    let date = formatDate(execSync('git show -s --format=%cd').toString()) // 日期
    let message = execSync('git show -s --format=%s').toString().trim() // 提交说明
    return {
      branch,
      commit,
      'commit message': message,
      name,
      email,
      date
    }
  } catch (error) {
    console.log(chalk.yellow('未能正确获取git信息'))
    return {}
  }
}
export default function () {
  const baseInfos = {
    user: os.userInfo().username,
    'build date': formatDate(Date.now())
  }
  const gitInfos = getGitInfo()
  return { baseInfos, gitInfos }
}
